Function MORLET_FILTER_BANK_2D
Package
filters
Short description
Compute a bank of Morlet wavelet filters in
Usage
filters = MORLET_FILTER_BANK_2D(size_in, options)
Input
options (structure): Options of the bank of filters. Optional, with
fields:
Q (numeric): number of scale per octave
J (numeric): total number of scale.
L (numeric): number of orientations
sigma_phi (numeric): standard deviation of the low-pass mother
wavelet
sigma_psi (numeric): standard deviation of the envelope of the
high-pass psi_0
xi_psi (numeric): the frequency peak of the band-pass mother
wavelet
slant_psi (numeric): excentricity of the elliptic enveloppe of the
band-pass psi_0 (the smaller slant, the larger orientation
resolution)
margins (numeric): 1-by-2 vector for the horizontal and vertical
margin for mirror pading of signal
precision (string): 'double' or 'single'
Output
filters (struct): filters, with the fields
psi (struct): band-pass filter psi, with the following fields:
filter (cell): cell of structure containing the coefficients
type (string): takes the value 'fourier_multires'
phi (struct): low-pass filter phi
filter (cell): cell of structure containing the coefficients
type (string): takes the value 'fourier_multires'
meta (struct): contains meta-information on (g,h)
Description
Compute the Morlet filter bank in the Fourier domain.
function filters = morlet_filter_bank_2d(size_in, options)
if(nargin<2)
options = struct;
end
white_list = {'Q', 'L', 'J', 'sigma_phi', 'sigma_psi', ...
'xi_psi', 'slant_psi', 'min_margin', 'precision'};
check_options_white_list(options, white_list);
Options
options = fill_struct(options, 'Q',1);
options = fill_struct(options, 'L',8);
options = fill_struct(options, 'J',4);
J = options.J;
Q = options.Q;
L = options.L;
options = fill_struct(options, 'sigma_phi', 0.8);
options = fill_struct(options, 'sigma_psi', 0.8);
options = fill_struct(options, 'sigma_psi', 0.8);
options = fill_struct(options, 'xi_psi', 1/2*(2^(-1/Q)+1)*pi);
options = fill_struct(options, 'slant_psi', 4/L);
options = fill_struct(options, 'filter_format', 'fourier_multires');
options = fill_struct(options, 'min_margin', options.sigma_phi * 2^(J/Q) );
options = fill_struct(options, 'precision', 'single');
sigma_phi = options.sigma_phi;
sigma_psi = options.sigma_psi;
xi_psi = options.xi_psi;
slant_psi = options.slant_psi;
switch options.precision
case 'single'
cast = @single;
case 'double'
cast = @double;
otherwise
error('precision must be either double or single');
end
Size
res_max = floor(J/Q);
size_filter = pad_size(size_in, options.min_margin, res_max);
phi.filter.type = 'fourier_multires';
Compute all resolution of the filters
res = 0;
N = size_filter(1);
M = size_filter(2);
Compute low-pass filters phi
scale = 2^((J-1) / Q - res);
filter_spatial = gabor_2d(N, M, sigma_phi*scale, 1, 0, 0);
phi.filter = cast(real(fft2(filter_spatial)));
phi.meta.J = J;
phi.filter = optimize_filter(phi.filter, 1, options);
littlewood_final = zeros(N, M);
Compute band-pass filters psi
angles = (0:L-1) * pi / L;
p = 1;
for j = 0:J-1
for theta = 1:numel(angles)
angle = angles(theta);
scale = 2^(j/Q - res);
filter_spatial = morlet_2d_noDC(N, ...
psi.filter{p} = cast(real(fft2(filter_spatial)));
littlewood_final = littlewood_final + ...
psi.meta.j(p) = j;
psi.meta.theta(p) = theta;
p = p + 1;
Second pass : renormalize psi by max of littlewood paley to have
an almost unitary operator
NB : phi must not be renormalized since we want its mean to be 1
K = max(littlewood_final(:));
for p = 1:numel(psi.filter)
psi.filter{p} = psi.filter{p}/sqrt(K/2);
psi.filter{p} = optimize_filter(psi.filter{p}, 0, options);
filters.phi = phi;
filters.psi = psi;
filters.meta.Q = Q;
filters.meta.J = J;
filters.meta.L = L;
filters.meta.sigma_phi = sigma_phi;
filters.meta.sigma_psi = sigma_psi;
filters.meta.xi_psi = xi_psi;
filters.meta.slant_psi = slant_psi;
filters.meta.size_in = size_in;
filters.meta.size_filter = size_filter;
See also
List of all packages